#include "tlrstructmodel.h"
#include <QDebug>

TLRStructModel::TLRStructModel()
{

}

/*
 * 从JSON字符串中加载
 * njsonstr : json字符串
 */
void TLRStructModel::loadFromJson(const QByteArray &njsondata)
{
    m_lrstructModel.clear();
    QJsonDocument njsondoc = QJsonDocument::fromJson(njsondata);
    if(!njsondoc.isNull()) {
        if(njsondoc.isObject()) {
            QJsonObject njsonbj_root = njsondoc.object();
            //模式
            m_mode = njsonbj_root.value("Mode").toString("debug");
            //通讯方式
            QString ncommtypestr = njsonbj_root.value("CommType").toString("net");
            if(ncommtypestr == "net") {
                m_commType = TCommType::ctNet;
            }
            else if(ncommtypestr == "serial") {
                m_commType = TCommType::ctSerial;
            }
            //设备识别字
            m_equidStr = njsonbj_root.value("EquIdStr").toString("-Null-");
            //结构体
            QJsonValue njsonval_structs = njsonbj_root.value("Structs");
            if(njsonval_structs.isArray()) {
                QJsonArray njsonarr_structs = njsonval_structs.toArray();
                //遍历结构
                for(int iroot=0;iroot<njsonarr_structs.size();iroot++) {
                    int ntotaloffset = 0;
                    QJsonObject njsonobj_struct = njsonarr_structs.at(iroot).toObject();
                    TLRStruct nlrstruct;
                    //结构体名称
                    nlrstruct.name = njsonobj_struct.value("Name").toString("-Null-");
                    //起始地址
                    nlrstruct.paraStaAdd = njsonobj_struct.value("ParaStaAdd").toInt(5000);
                    //解析成员
                    QJsonArray njsonarr_structmember = njsonobj_struct.value("MemberPool").toArray();
                    for(int istructmember=0;istructmember<njsonarr_structmember.size();istructmember++) {
                        QJsonObject njsonobj_structmember = njsonarr_structmember.at(istructmember).toObject();
                        TLRStructMember nlrstructmember;
                        //结构体成员名称
                        nlrstructmember.name = njsonobj_structmember.value("Name").toString("-Null-");
                        //结构体成员注释
                        nlrstructmember.desc = njsonobj_structmember.value("Desc").toString("-Null-");
                        //结构体成员类型
                        nlrstructmember.type = njsonobj_structmember.value("Type").toString("char");
                        //结构体成员数量
                        nlrstructmember.count = njsonobj_structmember.value("Count").toInt(1);
                        //结构体偏移
                        nlrstructmember.offset = ntotaloffset;
                        //基本数据类型
                        if(nlrstructmember.isPlainDataType()) {
                            nlrstructmember.calcUnitSize();
                        }
                        //自定义数据类型
                        else {
                            nlrstructmember.calcUnitSize(getStruct(nlrstructmember.type).getSize());
                        }
                        ntotaloffset += nlrstructmember.getSize();
                        nlrstruct.appendMember(nlrstructmember);
                    }
                    //分配内存
                    nlrstruct.allocMem();
                    m_lrstructModel.append(nlrstruct);
                }
            }
        }
    }
}

/*
 * 获取指定名称的结构体
 * nlrstructname : 指定的结构体名称
 */
TLRStruct TLRStructModel::getStruct(const QString &nlrstructname)
{
    TLRStruct nlrstruct;
    for(int i=0;i<m_lrstructModel.size();i++) {
        TLRStruct nlrstructsrc = m_lrstructModel.at(i);
        if(nlrstructname == nlrstructsrc.name) {
            nlrstruct = nlrstructsrc;
            break;
        }
    }
    return nlrstruct;
}

/*
 * 查找指定序号的结构体
 * nindex : 序号
 */
TLRStruct TLRStructModel::getStruct(int nindex)
{
    TLRStruct nlrstruct;
    if(nindex >= 0 && nindex < m_lrstructModel.size()) {
        nlrstruct = m_lrstructModel.at(nindex);
    }
    return nlrstruct;
}

/*
 * 获取正在通讯的结构体序号
 * 返回值 : 正在通讯的结构体序号
 */
int TLRStructModel::getCommIndex()
{
    return m_commIndex;
}

/*
 * 设置正在通讯的结构体序号
 * nindex : 正在通讯的结构体序号
 */
void TLRStructModel::setCommIndex(int nindex)
{
    m_commIndex = nindex;
}

/*
 * 序号是否合理
 * nindex : 序号
 * 返回值  : true合理 false不合理
 */
bool TLRStructModel::isIndexValid(int nindex)
{
    bool nret = false;
    if((nindex >= 0) && (nindex < m_lrstructModel.size())) {
        nret = true;
    }
    return nret;
}

/*
 * 获取模式
 * 返回值 : 模式
 */
QString TLRStructModel::getMode()
{
    return m_mode;
}

/*
 * 获取通讯方式
 * 返回值 : 通讯方式
 */
TCommType TLRStructModel::getCommType()
{
    return m_commType;
}

/*
 * 获取设备识别字
 */
QString TLRStructModel::getEquidStr()
{
    return m_equidStr;
}

